package com.captain.leetcode;

import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;

/**
 * Des:
 *
 * @author XL
 * @Date 2021/8/3 12:45
 * 给你一个字符串 path ，表示指向某一文件或目录的 Unix 风格 绝对路径 （以 '/' 开头），请你将其转化为更加简洁的规范路径。
 * <p>
 * 在 Unix 风格的文件系统中，一个点（.）表示当前目录本身；此外，两个点 （..） 表示将目录切换到上一级（指向父目录）；两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠（即，'//'）都被视为单个斜杠 '/' 。 对于此问题，任何其他格式的点（例如，'...'）均被视为文件/目录名称。
 * <p>
 * 请注意，返回的 规范路径 必须遵循下述格式：
 * <p>
 * 始终以斜杠 '/' 开头。
 * 两个目录名之间必须只有一个斜杠 '/' 。
 * 最后一个目录名（如果存在）不能 以 '/' 结尾。
 * 此外，路径仅包含从根目录到目标文件或目录的路径上的目录（即，不含 '.' 或 '..'）。
 * 返回简化后得到的 规范路径 。
 * 输入：path = "/home/"
 * 输出："/home"
 * 解释：注意，最后一个目录名后面没有斜杠。
 * <p>
 * 输入：path = "/../"
 * 输出："/"
 * 解释：从根目录向上一级是不可行的，因为根目录是你可以到达的最高级。
 * <p>
 * 输入：path = "/home//foo/"
 * 输出："/home/foo"
 * 解释：在规范路径中，多个连续斜杠需要用一个斜杠替换。
 * <p>
 * 输入：path = "/a/./b/../../c/"
 * 输出："/c"
 */
public class 简化路径71 {

    public static void main(String[] args) {
        System.out.println(new 简化路径71().simplifyPath("/home/"));

    }

    //依赖于双端队列解决
    public String simplifyPath(String path) {
        //双端队列
        LinkedList<String> queue = new LinkedList<>();
        String[] res = path.split("/");
        int m = res.length - 1;
        for (int i = 0; i <= m; i++) {
            String value = res[i];
            //本级目录, 跳过
            if ("".equals(value) || ".".equals(value)) continue;
                //返回上一级
            else if ("..".equals(value)) {
                if (!queue.isEmpty()) queue.pollLast();
            } else {
                //进入其他目录
                queue.offer(value);
            }
        }
        StringBuilder builder = new StringBuilder("/");
        while (!queue.isEmpty()) {
            builder.append(queue.poll());
            if (!queue.isEmpty()) builder.append("/");
        }
        return "".equals(builder.toString()) ? "/" : builder.toString();

    }
}
